#ifndef CUSTOMTABLEMODEL_H
#define CUSTOMTABLEMODEL_H

#include <QAbstractTableModel>
#include <QObject>
#include<QIcon>
/* 一个小结构体：放单元格要显示的所有东西 */
struct CustomTableItem
{
    QString text;      // 文字
    QIcon   icon;      // 图标
    QColor  fgColor;   // 文字颜色
    QColor  bgColor;   // 背景色
    CustomTableItem(const QString &t = "",
                    const QIcon &ic = QIcon(),
                    const QColor &fg = QColor(),
                    const QColor &bg = QColor())
        : text(t), icon(ic), fgColor(fg), bgColor(bg) {}
};
class CustomTableModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    //构造函数可以挂载到对象树中
    explicit CustomTableModel(QObject *parent = nullptr);
public:
    //返回表格有多少行数
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    //列数
    int columnCount(const QModelIndex &parent = QModelIndex()) const override;

    // 表头数据设置 - 新增
    bool setHeaderData(int section, Qt::Orientation orientation,
                       const QVariant &value, int role = Qt::EditRole) override;
    /* 视图通过它拿“显示文字/图标/颜色”
     * index：单元格坐标
     * role：  视图想拿什么数据（文字、图标、背景色……）
     */
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
    /* 拿表头文字
     * section：  第几行或第几列
     * orientation：横向表头还是纵向表头
     * role：      一般只要 DisplayRole
     */
    QVariant headerData(int section,
                        Qt::Orientation orientation,
                        int role = Qt::DisplayRole) const override;

    /* 控制单元格能否编辑、能否选中
     * index：单元格坐标
     */
    Qt::ItemFlags flags(const QModelIndex &index) const override;
    /* 视图编辑完以后，通过它把新值写回模型
     * index：单元格坐标
     * value： 用户输入的新值
     * role：  一般是 EditRole
     */
    bool setData(const QModelIndex &index,
                 const QVariant &value,
                 int role = Qt::EditRole) override;

    /* 在末尾追加一列 */
    void appendColumn(const QString &title);

    /* 删除第 column 列 */
    void removeColumn(int column);

    /* 一次性设置所有横向表头 */
    void setHorizontalHeaderLabels(const QStringList &labels);

    /* 在末尾追加一行 */
    void appendRow(const QVector<CustomTableItem> &items);


    /* 在第 row 行前面插入一行 */
    void insertRow(int row, const QVector<CustomTableItem> &items);

    /* 删除第 row 行 */
    void removeRow(int row);

    /* 改单个单元格的数据 */
    void setItem(int row, int column, const CustomTableItem &item);

    /* 读单个单元格的数据 */
    CustomTableItem item(int row, int column) const;

private:
    QStringList m_headers;                         // 横向表头
    QVector<QVector<CustomTableItem>> m_data;      // 二维数组存数据

};

#endif // CUSTOMTABLEMODEL_H
